#ifndef __SCRIPT_VAL_H__
#define __SCRIPT_VAL_H__

#include "TFly_list.h"

struct script_t;
#define SESSION_VAL_MAX 64
#define EXP_ARRAY_STEP 10
#define DEFAULT_FUNC_REFER (-10)

struct script_var;
struct exp_func_node;
struct script_exec_block;

typedef enum script_var_type{
	EXP_VAR_TYPE_NONE,
	EXP_VAR_TYPE_TRUE,
	EXP_VAR_TYPE_FALSE,
	EXP_VAR_TYPE_INT,
	EXP_VAR_TYPE_DOUBLE,
	EXP_VAR_TYPE_STRING,
	EXP_VAR_TYPE_STRUCT,
	EXP_VAR_TYPE_ARRAY,
	EXP_VAR_TYPE_POINT,
	EXP_VAR_TYPE_FUNCTION,
	EXP_VAR_TYPE_C_VAR,
	EXP_VAR_TYPE_STRUCT_MEM,
}script_var_type_e;

struct script_c_var{
	script_var_type_e type;	// 必须为常量类型 INT DOUBLE STRING
	void *value;
};

typedef struct exp_array{
	int size;		// 数组空间大小
	int len;		// 数组长度
	struct script_var **p;
}exp_array_t;

typedef struct {
	struct exp_func_node		*func;
	struct script_exec_block	*block;
}exp_var_func_t;

typedef struct exp_object{
	TFly_list_t children;
	int size;
}exp_object_t;

typedef struct script_var{
	char					*name;
	int						refer;	// 引用计数
	script_var_type_e		type;
	union{
		int		value;				// 整型
		double	number;				// 浮点型
		char	*str;				// 字符串
		struct script_var *var;		// 指针
		struct script_c_var *c_var;	// c变量绑定
		//struct exp_func_node *func;	// 函数指针
		exp_var_func_t			*func;
		exp_array_t *array;			// 数组
		exp_object_t *object;		// 结构体
	};
	//struct script_var *next;
}exp_var_t,script_var_t;

/********************************************************
 *	function	exp_var_create
 *		创建变量
 * ******************************************************/
exp_var_t *exp_var_create(const char *name);

/********************************************************
 *	function	exp_c_var_create
 *		创建c关联变量
 *
 * ******************************************************/
exp_var_t *exp_c_var_create(const char *name,script_var_type_e type, void *value);

/********************************************************
 *	function	exp_var_refer
 *		引用变量
 *
 * ******************************************************/
exp_var_t *exp_var_refer(exp_var_t *var);

/********************************************************
 *	function	exp_var_destroy
 *		销毁变量
 *
 * ******************************************************/
void exp_var_destroy(exp_var_t *var);

exp_var_func_t *exp_var_func_create(struct exp_func_node *efunc, struct script_exec_block *block);

/********************************************************
 *	function	exp_var_point_take
 *		获取指针变量指向的实体
 *
 * ******************************************************/
exp_var_t *exp_var_point_take(exp_var_t *var);

/********************************************************
 *	function exp_var_cope_to_new
 *		拷贝 var
 * ******************************************************/
exp_var_t *exp_var_copy_to_new(exp_var_t *var);

int exp_var_copy(exp_var_t *src, exp_var_t *dst);

char *exp_var_print(exp_var_t *var);

exp_var_t *exp_var_parse(const char *var_name,const char *str);

void show_exp_var(exp_var_t *var,int deep);

/********************************************************
 *	function exp_var_struct_add
 *		添加成员到结构体变量
 *		如果成员存在，则删除后添加
 *
 * ******************************************************/
int exp_var_struct_add(exp_var_t *parent, exp_var_t *var);

/********************************************************
 *	function exp_var_add_child
 *
 * ******************************************************/
int exp_var_add_child(exp_var_t *_parent, exp_var_t *var);

/********************************************************
 *	function exp_var_struct_add_parse
 *		把str解析为变量并添加到结构体parent中
 * ******************************************************/
exp_var_t *exp_var_struct_add_parse(exp_var_t *parent,const char *name,const char *str);

/********************************************************
 *	function exp_var_struct_delete
 *		删除结构体变量中的成员
 *
 * ******************************************************/
int exp_var_struct_delete(exp_var_t *parent,const char *var_name);

/********************************************************
 *	function exp_var_struct_clean
 *		清空结构体成员
 * ******************************************************/
int exp_var_struct_clean(exp_var_t *parent);

/********************************************************
 *	function exp_var_struct_get_var
 *		获取结构体变量的成员
 *
 * ******************************************************/
exp_var_t *exp_var_struct_get_var(exp_var_t *parent,const char *var_name);

/********************************************************
 *
 * ******************************************************/
exp_var_t *exp_var_struct_get_index(exp_var_t *array, int index);

/********************************************************
 *
 * ******************************************************/
exp_var_t *exp_var_array_get(exp_var_t *var,int index);

/********************************************************
 *
 * ******************************************************/
int exp_var_size(exp_var_t *array);

/********************************************************
 *
 * ******************************************************/
int exp_var_array_delete(exp_var_t *array, int index);

exp_array_t *exp_array_create(void);
void exp_array_destroy(exp_array_t *array);
int exp_array_insert(exp_array_t *array, exp_var_t *var, int index);
int exp_array_add(exp_array_t *array, exp_var_t *var);

exp_object_t *exp_object_create(void);
void exp_object_destroy(exp_object_t *object);
exp_object_t *exp_object_copy(exp_object_t *src);

void exp_var_struct_print_var();
#endif

